From: Chen Baozi Date: Tue, 30 Jun 2015 08:00:17 +0000 (+0800) Subject: xen/arm: Use the new functions for vCPUID/vaffinity transformation X-Git-Tag: archive/raspbian/4.8.0-1+rpi1~1^2~2954 X-Git-Url: https://dgit.raspbian.org/%22http://www.example.com/cgi/%22/%22http:/www.example.com/cgi/%22?a=commitdiff_plain;h=bc5deb5930e7207e386999537512f0c737219263;p=xen.git xen/arm: Use the new functions for vCPUID/vaffinity transformation There are 3 places to change: * Initialise vMPIDR value in vcpu_initialise() * Find the vCPU from vMPIDR affinity information when accessing GICD registers in vGIC * Find the vCPU from vMPIDR affinity information when booting with vPSCI in vGIC - Both PSCI 0.1 and PSCI 0.2 are modified to respect the MPIDR like. Signed-off-by: Chen Baozi Reviewed-by: Julien Grall Acked-by: Ian Campbell --- diff --git a/xen/arch/arm/domain.c b/xen/arch/arm/domain.c index 21a03dfe35..7ed6db8bac 100644 --- a/xen/arch/arm/domain.c +++ b/xen/arch/arm/domain.c @@ -501,11 +501,7 @@ int vcpu_initialise(struct vcpu *v) v->arch.sctlr = SCTLR_GUEST_INIT; - /* - * By default exposes an SMP system with AFF0 set to the VCPU ID - * TODO: Handle multi-threading processor and cluster - */ - v->arch.vmpidr = MPIDR_SMP | (v->vcpu_id << MPIDR_AFF0_SHIFT); + v->arch.vmpidr = MPIDR_SMP | vcpuid_to_vaffinity(v->vcpu_id); v->arch.actlr = READ_SYSREG32(ACTLR_EL1); diff --git a/xen/arch/arm/vgic-v3.c b/xen/arch/arm/vgic-v3.c index 77428c5411..8b9d7e1ed6 100644 --- a/xen/arch/arm/vgic-v3.c +++ b/xen/arch/arm/vgic-v3.c @@ -82,7 +82,7 @@ static struct vcpu *vgic_v3_irouter_to_vcpu(struct domain *d, uint64_t irouter) if ( irouter & GICD_IROUTER_SPI_MODE_ANY ) return d->vcpu[0]; - vcpu_id = irouter & MPIDR_AFF0_MASK; + vcpu_id = vaffinity_to_vcpuid(irouter); if ( vcpu_id >= d->max_vcpus ) return NULL; diff --git a/xen/arch/arm/vpsci.c b/xen/arch/arm/vpsci.c index 5d899be3fe..aebe1e2054 100644 --- a/xen/arch/arm/vpsci.c +++ b/xen/arch/arm/vpsci.c @@ -32,10 +32,7 @@ static int do_common_cpu_on(register_t target_cpu, register_t entry_point, int is_thumb = entry_point & 1; register_t vcpuid; - if( ver == XEN_PSCI_V_0_2 ) - vcpuid = (target_cpu & MPIDR_HWID_MASK); - else - vcpuid = target_cpu; + vcpuid = vaffinity_to_vcpuid(target_cpu); if ( vcpuid >= d->max_vcpus || (v = d->vcpu[vcpuid]) == NULL ) return PSCI_INVALID_PARAMETERS;